package users

import (
	"context"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/mojocn/base64Captcha"
	"shenmawl/utility"
)

// CreateAndSaveCaptcha 创建并保存验证码
func (u *NoRBACUsers) CreateAndSaveCaptcha(ctx context.Context) (id, b64s, answer string, err error) {
	//创建redis   后面的几个变量是用来写生成验证码的值的格式或者大小等。
	driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.7, 80)
	captcha := base64Captcha.NewCaptcha(driver, base64Captcha.DefaultMemStore)
	id, b64s, answer, err = captcha.Generate()
	//返回三个变量，第一个id是验证码的id，是唯一存在，b6s是验证码的base64的编码，answer是验证码图片上的答案比如9603

	//保存redis
	captchaData := g.Map{
		"captcha_id": id,
		"image_data": b64s,
		"answer":     answer,
	}
	_, err = g.Redis().HSet(ctx, id, captchaData)
	if err != nil {
		return "", "", "", utility.Err.Skip(92002)
	}
	//设置验证码过期时间（TTL
	_, err = g.Redis().Expire(ctx, id, int64(120))
	return
}

// VerifyCaptcha 验证验证码
func (u *NoRBACUsers) VerifyCaptcha(ctx context.Context, id, captchaSolution string) (flag bool, err error) {
	captcha, err := g.Redis().HGet(ctx, id, "answer")
	if err != nil {
		//g.Log().Fatal(ctx, err)
		return false, utility.Err.Skip(92002)
	}
	captchaExists, err := g.Redis().Exists(ctx, id)
	if captchaExists <= 0 {
		return false, utility.Err.Skip(20002)
	}
	if captchaSolution == captcha.String() {
		_, err := g.Redis().Del(ctx, id)
		if err != nil {
			//g.Log().Fatal(ctx, err)
			return false, utility.Err.Skip(92002)
		}
		return true, err
	}
	//判断用户输入的验证码和redis存储的真正的验证码的值是否相等。
	return false, utility.Err.Skip(20003)
}
